package cn.edu.bzu.aaa.dao;

import cn.edu.bzu.aaa.model.TrainingInfo;
import cn.edu.bzu.aaa.until.C3P0Util;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class TrainingInfoDAO {

    /**
     * 获取所有培训信息记录。
     *
     * @return 包含所有培训信息记录的列表。
     */
    public List<TrainingInfo> getAll() {
        List<TrainingInfo> list = new ArrayList<>();
        try (Connection conn = C3P0Util.getConnection();
             PreparedStatement ps = conn.prepareStatement("SELECT * FROM traininginfo")) {
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                list.add(populateTrainingInfo(rs));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }

    /**
     * 根据ID获取特定的培训信息记录。
     *
     * @param id 培训信息记录的ID。
     * @return 对应ID的培训信息记录，如果不存在则返回null。
     */
    public TrainingInfo getByID(int id) {
        try (Connection conn = C3P0Util.getConnection();
             PreparedStatement ps = conn.prepareStatement("SELECT * FROM traininginfo WHERE TrainingID = ?")) {
            ps.setInt(1, id);
            ResultSet rs = ps.executeQuery();
            if (rs.next()) {
                return populateTrainingInfo(rs);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 添加新的培训信息记录。
     *
     * @param ti 新的培训信息记录对象。
     */
    public void add(TrainingInfo ti) {
        try (Connection conn = C3P0Util.getConnection();
             PreparedStatement ps = conn.prepareStatement(
                     "INSERT INTO traininginfo (Title, Content, AttachmentPath) VALUES (?, ?, ?)",
                     Statement.RETURN_GENERATED_KEYS)) {
            ps.setString(1, ti.getTitle());
            ps.setString(2, ti.getContent());
            ps.setString(3, ti.getAttachmentPath());

            ps.executeUpdate();

            ResultSet generatedKeys = ps.getGeneratedKeys();
            if (generatedKeys.next()) {
                ti.setTrainingID(generatedKeys.getInt(1));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 更新现有的培训信息记录。
     *
     * @param ti 要更新的培训信息记录对象。
     */
    public void update(TrainingInfo ti) {
        try (Connection conn = C3P0Util.getConnection();
             PreparedStatement ps = conn.prepareStatement(
                     "UPDATE traininginfo SET Title=?, Content=?, AttachmentPath=? WHERE TrainingID=?")) {
            ps.setString(1, ti.getTitle());
            ps.setString(2, ti.getContent());
            ps.setString(3, ti.getAttachmentPath());
            ps.setInt(4, ti.getTrainingID());

            ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 删除指定ID的培训信息记录。
     *
     * @param id 要删除的培训信息记录的ID。
     */
    public void delete(int id) {
        try (Connection conn = C3P0Util.getConnection();
             PreparedStatement ps = conn.prepareStatement("DELETE FROM traininginfo WHERE TrainingID = ?")) {
            ps.setInt(1, id);
            ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 从ResultSet中填充并返回一个新的TrainingInfo对象。
     *
     * @param rs ResultSet对象，包含一行数据。
     * @return 填充后的TrainingInfo对象。
     * @throws SQLException 如果读取ResultSet时发生错误。
     */
    private TrainingInfo populateTrainingInfo(ResultSet rs) throws SQLException {
        TrainingInfo ti = new TrainingInfo();
        ti.setTrainingID(rs.getInt("TrainingID"));
        ti.setTitle(rs.getString("Title"));
        ti.setContent(rs.getString("Content"));
        ti.setAttachmentPath(rs.getString("AttachmentPath"));
        return ti;
    }
}